package com.yaoxiaoqing.basis;

import java.util.Scanner;

/*
 * 一、数组的概述
 * 1.数组的理解：数组(Array)，是多个相同类型数据按一定顺序排列的集合，
 * 并使用一个名字命名，并通过编号的方式对这些数据进行统一管理。
 *
 * 2.数组的相关概念：
 * >数组名
 * >元素
 * >角标、下标、索引
 * >数组的长度：元素的个数
 *
 * 3.数组的特点：
 * 1)数组属于引用类型的变量。数组的元素，既可以是基本数据类型，也可以是引用数据类型。
 * 2)创建数组对象会在内存中开辟一整块连续的空间；
 * 3)数组的长度一旦确定，就不能修改;
 * 4)数组是有序排列的。
 *
 * 4.数组的分类：
 * 	① 按照维数：一维数组、二维数组、三维数组……
 *  ② 按照数组元素类型：基本数据类型元素的数组、引用类型元素的数组
 *格式化 ctrl+alt+l
 * 查找类 ctrl+n
 */
public class Array {
    public static void main(String[] args) {
        //1.声明
        int num;
        num = 10;//初始化
        int id = 1001;//声明+初始化      ctrl+shift+enter 自动补齐分号

        //1.静态初始化：数组的初始化和数组元素的赋值操作同时进行
        int[] ids;//声明
        ids = new int[]{1001, 1002, 1003, 1004};//初始化
        //2.动态初始化：数组的初始化和数组元素的赋值分开进行
        String[] names = new String[5];//指明数组长度为5

        //错误写法
//        int[] arr1 = new int[];//未赋值、未指明长度
//        int[5] arr2=new int[5];//前面的中括号不能加
//        int arr3=new int[3]{1,2,3};//后面有赋值，就不需要声明数组长度

        int[] arr7 = {1, 2, 3, 4, 5};//正确写法，会进行类型推断 //int[] arr7=int[]{1,2,3,4,5}
        String[] arr8 = {"你好", "再见", "哈哈哈"};
        /*
         * 总结：数组一旦初始化完成，其长度就确定了
         * */

        //2.如何调用数组的指定位置的元素：通过角标的方式调用。
        //数组的角标(或索引)从0开始的，到数组的长度-1结束
        names[0] = "张郃";
        names[1] = "王陵";
        names[2] = "张学良";
        names[3] = "王传志";    //charAt(0)
        names[4] = "李峰";
//		names[5] = "周礼";	//如果数组超过角标会通过编译，运行失败。

        //3.如何获取数组的长度
        //属性：length
        System.out.println(names.length);    //5
        System.out.println(ids.length);    //4

        //4.如何遍历数组
//		System.out.println(names[0]);
//		System.out.println(names[1]);
//		System.out.println(names[2]);
//		System.out.println(names[3]);
//		System.out.println(names[4]);

        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }
        for (int i = 0; i < arr8.length; i++) {
            System.out.println(arr8[i]);
        }


        /*
         * ⑤ 数组元素的默认初始化值
         * 		> 数组元素是整形：0
         * 		> 数组元素是浮点型：0.0
         * 		> 数组元素是char型：0或'\u0000'，而非'0'
         * 		> 数组元素是boolean型:false
         * 		> 数组元素是引用数据类型：null
         */
        System.out.println("*****************整数int*******************");
        int[] arra1 = new int[4];
        for (int i = 0; i < arra1.length; i++) {
            System.out.println(arra1[i]);//0
        }
        System.out.println("*****************short*******************");
        short[] arra2 = new short[4];
        for (int i = 0; i < arra2.length; i++) {
            System.out.println(arra2[i]);//0
        }
        System.out.println("*****************float*******************");
        float[] arra3 = new float[4];
        for (int i = 0; i < arra3.length; i++) {
            System.out.println(arra3[i]);//0.0
        }
        System.out.println("*****************char*******************");
        char[] arra4 = new char[4];
        for (int i = 0; i < arra4.length; i++) {
            System.out.println("---" + arra4[i] + "---");//直接为空   char 值为数字0或者'\u0000'，显示为空，
        }
        if (arra4[0] == 0) {
            System.out.println("111111");//执行了
        }
        if (arra4[1] == '\u0000') {
            System.out.println("值为'\\u0000'");
        }
        System.out.println("--------------");

        System.out.println("*****************boolean*******************");
        boolean[] arra5 = new boolean[4];
        for (int i = 0; i < arra5.length; i++) {
            System.out.println(arra5[i]);
        }
        System.out.println("*****************String*******************");
        String[] arra6 = new String[4];
        for (int i = 0; i < arra6.length; i++) {
            System.out.println(arra6[i]);
        }
        if (arra6[0] == null) {
            System.out.println("String 的空值为null");
        }

        /*一维数组的内存解析*/
        int[] arr = new int[]{1, 2, 3};
        String[] arr1 = new String[4];
        arr1[1] = "刘德华";
        arr1[2] = "张学友";
        arr1 = new String[3];
        System.out.println(arr1[1]);//null


        int[] arr2 = new int[]{8, 2, 1, 0, 3};
        int[] index = new int[]{2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3};
        String tel = "";
        for (int i = 0; i < index.length; i++) {
            tel += arr2[index[i]];
        }
        System.out.println("联系方式：" + tel);


        /*
         * 2. 从键盘读入学生成绩，找出最高分，并输出学生成绩等级。
         * 成绩>=最高分-10    等级为’A’   
         * 成绩>=最高分-20    等级为’B’
         * 成绩>=最高分-30    等级为’C’   
         * 其余等级为’D’
         * 提示：先读入学生人数，根据人数创建int数组，存放学生成绩。
         */

        //1.输入人数
        Scanner sc = new Scanner(System.in);
        System.out.println("请先输入学生人数");
        int num1 = sc.nextInt();

        //2.动态初始化数组
        int[] str = new int[num1];
        System.out.println("输入学生人数为" + num1);

        //3.给数组中元素赋值，所以去遍历数组 并获取最大值
        int maxNum = 0;
        for (int i = 0; i < str.length; i++) {
            str[i] = sc.nextInt();
            //4.获取元素中最大值
            if (maxNum < str[i]) {
                maxNum = str[i];
            }
        }
        //5.根据每个学生成绩与最高分的差值，输出等级和成绩
        char Grade;//成绩等级
        for (int i = 0; i < str.length; i++) {
            if (str[i] > maxNum - 10) {
                Grade = 'A';
            } else if (str[i] >= maxNum - 20) {
                Grade = 'B';
            } else if (str[i] >= maxNum - 30) {
                Grade = 'C';
            } else {
                Grade = 'D';
            }

            System.out.println("学生" + i + "成绩为：" + str[i] + ";" + "成绩等级为:" + Grade);

        }


    }
}
